package com.cmes.core.utils;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * 数字工具类
 *
 * @author Bruce.Gong
 * @since 1.0.0-SNAPSHOT
 */
public class NumberUtils extends org.apache.commons.lang3.math.NumberUtils {

    /**
     * 判断两个数值是否相等，如果有一个值为 null，则一定不相等
     *
     * @param number1 数1
     * @param number2 数2
     * @return true | false
     */
    public static <T extends Number & Comparable<T>> boolean equals(T number1, T number2) {
        return number1 != null && number2 != null && number1.compareTo(number2) == 0;
    }

    /**
     * 如果 {@code number} 为 {@code null}，则返回 {@code def}，否则返回 {@code number} 本身
     *
     * @param number 数值
     * @return number || def
     */
    public static <T extends Number> T orElse(T number, T def) {
        return number == null ? def : number;
    }

    public static List<Integer> intRange(int start, int end) {
        return IntStream.rangeClosed(start, end).boxed().collect(Collectors.toList());
    }

    /**
     * 最大公约数(Greatest Common Divisor)
     *
     * @param a 数1
     * @param b 数2
     * @return 最大公约数
     */
    public static int gcd(int a, int b) {
        Preconditions.state(a >= 1 && b >= 1, "参数不能小于1");
        if (a < b) {
            a = a + b;
            b = a - b;
            a = a - b;
        }
        return (a % b == 0) ? b : gcd(a % b, b);
    }

    /**
     * 最小公倍数(Least Common Multiple)
     *
     * @param a 数1
     * @param b 数2
     * @return 最小公倍数
     */
    public static int lcm(int a, int b) {
        Preconditions.state(a >= 1 && b >= 1, "参数不能小于1");
        return a * b / gcd(a, b);
    }

}